package com.personal_workspace_java.common;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ReflectUtil;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SuperUtil {
    /**
    * 将两个源对象的属性拷贝到目标对象中
    *
    * @param source1 第一个源对象
    * @param source2 第二个源对象
    * @param target  目标对象
    * @param <T>     目标对象的类型
    * @return 拷贝属性后的目标对象
    */
    public static <T> T copyPropertiesToObject(Object source1, Object source2, T target) {
        if (source1 != null) {
            BeanUtil.copyProperties(source1, target);
        }
        if (source2 != null) {
            BeanUtil.copyProperties(source2, target);
        }
        return target;
    }

    /**
    * 将两个源对象的属性拷贝到目标 VO 类的实例中
    *
    * @param source1  第一个源对象
    * @param source2  第二个源对象
    * @param voClass  目标 VO 类的 Class 对象
    * @param <T>      目标 VO 对象的类型
    * @return 拷贝属性后的目标 VO 对象实例
    */
    public static <T> T copyPropertiesToVo(Object source1, Object source2, Class<T> voClass){
        // 创建目标 VO 类的实例
        T target = ReflectUtil.newInstanceIfPossible(voClass);

        if (source1 != null) {
            BeanUtil.copyProperties(source1, target);
        }
        if (source2 != null) {
            BeanUtil.copyProperties(source2, target);
        }
        return target;
    }

    /**
    * 将两个源对象的属性拷贝到目标 VO 类的实例中
    *
    * @param source1  第一个源对象
    * @param source2  第二个源对象
    * @param voClass  目标 VO 类的 Class 对象
    * @param <T>      目标 VO 对象的类型
    * @return 拷贝属性后的目标 VO 对象实例
    */
    public static <T> T copyPropertiesToVo(Object source1, Object source2,Object source3 ,Class<T> voClass){
        // 创建目标 VO 类的实例
        T target = ReflectUtil.newInstanceIfPossible(voClass);

        if (source1 != null) {
            BeanUtil.copyProperties(source1, target);
        }
        if (source2 != null) {
            BeanUtil.copyProperties(source2, target);
        }
        if (source3 != null) {
            BeanUtil.copyProperties(source3, target);
        }
        return target;
    }

    /**
    * 将QueryList集合转化map
    * @param list
    * @return 集合转化map
    */
    public static Map<String, Object> listToMap(List<Query> list) {
        Map<String, Object> map = new HashMap<>();
        for (Query query : list) {
            map.put(query.getQueryName(), query.getQueryValue());
        }
        return map;
    }

}
